home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / util3 / disktype.lha / disktype / DiskType.c < prev    next >
C/C++ Source or Header  |  1995-08-07  |  5KB  |  190 lines

  1. /* myfsinfo.c - program to display disk types for volumes currently in
  2.  *               system.
  3.  *
  4.  * Doesn't check all allocations!
  5.  *
  6.  * ToDo: ReadArgs() interface to specify a particular device
  7.  *       Pooled memory allocation ? nah, no real point.
  8.  */
  9.  
  10. #include <exec/types.h>
  11. #include <exec/alerts.h>
  12. #include <exec/nodes.h>
  13. #include <exec/lists.h>
  14. #include <exec/memory.h>
  15. #include <exec/libraries.h>
  16. #include <exec/tasks.h>
  17. #include <exec/execbase.h>
  18. #include <dos/dos.h>
  19. #include <dos/dosextens.h>
  20.  
  21. #include <proto/dos.h>
  22. #include <proto/exec.h>
  23.  
  24. struct MyVolumeNode {
  25.     struct MinNode minnode;
  26.     STRPTR name;
  27.     ULONG DiskType;
  28. };
  29.  
  30. #define IsMinListEmpty(x) \
  31.     ( ((x)->mlh_TailPred) == (struct MinNode *)(x) )
  32.  
  33. static const TEXT verstag[] = "$VER: disktype 42.1 (7.8.95)\0";
  34. static const TEXT HexFmt[] = "$%08lx";
  35. static const UWORD putChProc[2] = { 0x16c0, 0x4e75 };
  36. /*static const TEXT cmdTemplate[] = "DEVICE";*/
  37.  
  38. static __inline void InlineNewList( struct List *list );
  39.  
  40. ULONG main( void )
  41. {
  42.     struct ExecBase        *SysBase = (*((struct ExecBase **)4L));
  43.     struct DosLibrary    *DOSBase;        /* obvious ;) */
  44.     struct DosList        *dosList;        /* pointer to system doslist */
  45.     struct MinList        myVolList;        /* pointer to private copy */
  46.     struct MyVolumeNode    *thisVol;        /* pointer to current volume node */
  47.     struct Process        *myProcess = (struct Process *) SysBase->ThisTask;
  48.     ULONG                rc = 0L;        /* our return code */
  49.  
  50.     /* open dos */
  51.     if (!(DOSBase = (struct DosLibrary *) OpenLibrary("dos.library",36L)))
  52.     {
  53.         Alert( AG_OpenLib | AO_DOSLib );
  54.         myProcess->pr_Result2 = ERROR_INVALID_RESIDENT_LIBRARY;
  55.         return( 20L );
  56.     }
  57.  
  58.     /* init volume list */
  59.     InlineNewList((struct List *)&myVolList);
  60.  
  61.     /* arbitrate for system doslist */
  62.     dosList = LockDosList(LDF_VOLUMES|LDF_READ);
  63.  
  64.     while (dosList = NextDosEntry(dosList,LDF_VOLUMES))
  65.     {
  66.         /* add node to vollist */
  67.         STRPTR newName;
  68.         STRPTR oldName;
  69.         ULONG nameSize;
  70.  
  71.         /* get memory for node */
  72.         thisVol = AllocMem( sizeof(struct MyVolumeNode), MEMF_CLEAR);
  73.  
  74.         /* copy type */
  75.         thisVol->DiskType = dosList->dol_misc.dol_volume.dol_DiskType;
  76.  
  77.         /* copy name */
  78.         oldName = BADDR(dosList->dol_Name);        /* BCPL cabbage */
  79.         nameSize = (ULONG)(*oldName);
  80.  
  81.         newName = AllocVec((nameSize+1),0L);        /* get RAM for string */
  82.         CopyMem((oldName+1), newName, nameSize);    /* copy it */
  83.         newName[nameSize] = ':';                    /* append terminator */
  84.         newName[nameSize+1] = '\0';                    /* append terminator */
  85.         thisVol->name = newName;                    /* put pointer in node */
  86.  
  87.         AddTail((struct List *)&myVolList,(struct Node *)thisVol);
  88.     }
  89.     UnLockDosList(LDF_VOLUMES|LDF_READ);    /* finished with system doslist */
  90.  
  91.     PutStr("Volume              DosType\n");        /* make localisable? */
  92.  
  93.     if ( !IsMinListEmpty( (struct MinList *) &myVolList))
  94.         for (    thisVol = (struct MyVolumeNode *) myVolList.mlh_Head;
  95.                 thisVol->minnode.mln_Succ;
  96.                 thisVol = (struct MyVolumeNode *) thisVol->minnode.mln_Succ )
  97.     {
  98.         TEXT hexFmtBuf[64];
  99.         ULONG disktype = thisVol->DiskType;
  100.         STRPTR verboseType;
  101.  
  102.         if (!disktype)
  103.         {
  104.             /* we need to do it the hard way */
  105.             struct InfoData info;
  106.             BPTR rootLock;
  107.  
  108.             /* I can't be bothered checking ;) */
  109.             /* and i'd rather have used packets instead... */
  110.  
  111.             rootLock = Lock( thisVol->name, SHARED_LOCK );
  112.             (void) Info( rootLock, &info );
  113.             UnLock(rootLock);
  114.  
  115.             disktype = info.id_DiskType;
  116.         }
  117.  
  118.         switch( disktype )
  119.         {
  120.             case ID_UNREADABLE_DISK:
  121.                 verboseType = "Unreadable disk";    /* make localisable */
  122.             break;
  123.             case ID_DOS_DISK:
  124.                 verboseType = "OFS [DOS\\0]";
  125.             break;
  126.             case ID_FFS_DISK:
  127.                 verboseType = "FFS [DOS\\1]";
  128.             break;
  129.             case ID_INTER_DOS_DISK:
  130.                 verboseType = "OFS INTL [DOS\\2]";
  131.             break;
  132.             case ID_INTER_FFS_DISK:
  133.                 verboseType = "FFS INTL [DOS\\3]";
  134.             break;
  135.             case ID_FASTDIR_DOS_DISK:
  136.                 verboseType = "DCFS OFS [DOS\\4]";
  137.             break;
  138.             case ID_FASTDIR_FFS_DISK:
  139.                 verboseType = "DCFS FFS [DOS\\5]";
  140.             break;
  141.             case ID_MSDOS_DISK:
  142.                 verboseType = "MS-DOS [MSD\\0]";
  143.             break;
  144.             case ID_KICKSTART_DISK:
  145.                 verboseType = "Kickstart [KICK]";
  146.             break;
  147.             case ID_NOT_REALLY_DOS:
  148.                 Fault( ERROR_NOT_A_DOS_DISK, NULL, hexFmtBuf, 64L );
  149.                 verboseType = hexFmtBuf; /* localised. */
  150.             break;
  151.             default:
  152.                 /* do substitution for unprintable chars */
  153.                 RawDoFmt(HexFmt, &HexFmt+1, (void (*)) putChProc, hexFmtBuf);
  154.                 verboseType = hexFmtBuf;
  155.             break;
  156.         }
  157.  
  158.         /* spill the beans */
  159.         Printf("%-20s%s\n",thisVol->name,verboseType);
  160.     }
  161.  
  162. cleanup:
  163.  
  164.     /* free our volume list */
  165.     if ( !IsMinListEmpty( (struct MinList *) &myVolList))
  166.     {
  167.         /* List header is not updated while each node is freed (!) */
  168.         struct MyVolumeNode *worknode = (struct MyVolumeNode *) myVolList.mlh_Head;
  169.         struct MyVolumeNode *nextnode;
  170.  
  171.         while (nextnode = (struct MyVolumeNode *)(worknode->minnode.mln_Succ))
  172.         {
  173.             if (worknode->name) FreeVec(worknode->name);    /* free string */
  174.             FreeMem(worknode, sizeof(struct MyVolumeNode));
  175.             worknode = nextnode;
  176.         }
  177.     } /* until done */
  178.  
  179.     CloseLibrary((struct Library *)DOSBase);
  180.     return(rc);
  181. }
  182.  
  183. static __inline void InlineNewList( struct List *list )
  184. {
  185.     list->lh_TailPred = (struct Node *) list;    /* get lh_tail */
  186.     list->lh_Tail = NULL;                        /* clear lh_Tail */
  187.     list->lh_Head = (struct Node *) &(list->lh_Tail);    /* address of lh_tail to lh_Head */
  188. }
  189.  
  190. /* disktype.c */